#! /usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2020/10/17 22:35
# @Author : youngchaolin

# 1 请写一个电影投票程序，现在上映的电影列表如下：
lst = ['中国机长', '我和我的祖国', '攀登者', '上海堡垒', '复仇者联盟']
# 用户给每个电影投票，最后将用户的投票结果公布出来

# 要求：
# 用户可以持续投票，用户输入序号，进行投票，比如输入1，就给中国机长投票
# 每次投票成功，显示给那部电影投票成功
# 退出投票程序后，要最终显示每个电影的投票数
# 建议最终展示效果如下
# {'中国机长':100,'我和我的祖国':100,'攀登者':99,'上海堡垒':1,'复仇者联盟':100}

# 定义一个字典，储存电影投票结果
dic_movie_result = dict.fromkeys(lst, 0)

while True:
    # 打印出所有的电影信息
    for index,film_name in enumerate(lst):
        print(f'序号{index+1},电影名称{film_name}')
    num = input('请输入序号进行投票[1-5]').strip()
    if num.upper() == 'Q':
        print('投票结束，结果如下')
        print(dic_movie_result)
        break
    else:
        if num.isdecimal():
            # 获取用户结果
            if 0 < int(num) <= len(lst):
                movie = lst[int(num) - 1]
                print(f'给电影\'{movie}\'投上一票成功')
                # 更新投票结果
                dic_movie_result[movie] = dic_movie_result.get(movie, 0) + 1
            else:
                print('投票超出范围，请重新输入')
        else:
            print('输入格式有误，请输入数字')

# 2 按要求完成下列转化
list1=[
    {"name":"alex","hobby":"抽烟"},
    {"name":"alex","hobby":"喝酒"},
    {"name":"alex","hobby":"烫头"},
    {"name":"alex","hobby":"泡妹"},
    {"name":"wusir","hobby":"唱歌"},
    {"name":"wusir","hobby":"开车"},
    {"name":"wusir","hobby":"打飞机"}
]
# 转化后
list2=[
    {"name":"alex","hobby_list":["抽烟","喝酒","烫头","泡妹"]},
    {"name":"wusir","hobby_list":["唱歌","开车"]}
]

# 将list1这种数据转换为list2，写的代码必须支持可扩展
# 比如list1数据中加一个字典{"name":"wusir","hobby":"溜达"}
# list2数据中更新为{"name":"wusir","hobby_list":["唱歌","街舞","溜达"]}
# 比如list1数据中加一个字典{"name":"clyang","hobby":"敲代码"}
# list2数据中新增一条数据{"name":"clyang","hobby_list":["敲代码"]}

# 方式1，直接构建（自己写的）
list3=[]
for dic_list1 in list1:
    # 获取list1中字典的key和value
    name=dic_list1.get("name")
    hobby=dic_list1.get("hobby")
    # 往list3中添加信息，需要循环判断list3中字典是否有list1中key
    # 标识符，用于标识是否有这个key
    has_key=False
    # 记录以下循环中，索引位置
    key_index=-1
    for dic_list3 in list3:
        if name == dic_list3.get("name"):
            has_key=True
            key_index+=1
            break
        else:
            key_index+=1
    # list3中字典有list1中的key 更新字典
    if has_key:
        # 根据上面记录的索引，找到list3中对应的字典
        if list3[key_index].get("name") == name:
            list3[key_index]["hobby_list"].append(hobby)
        else:
            print("检查索引是否正确")
    # list3中字典没有有list1中的key 新增字典
    else:
        list3.append({"name":name,"hobby_list":[hobby]})

print(list3)

# 方式1，直接构建（视频）
list4=[]
for l1 in list1:
    # for循环正常走完，将执行else里代码，break将不执行else里代码
    # 可参考博文https://www.cnblogs.com/lybigdata/p/10037190.html
    for l4 in list4:
        if l1["name"]==l4["name"]:
            l4["hobby_list"].append(l1["hobby"])
            break
    else:
        list4.append({"name":l1["name"],"hobby_list":[l1["hobby"]]})

print(list4)

# 方式2，使用特殊的数据结构,key为alex、wusir，value为 {"name":"alex","hobby_list":["抽烟","喝酒","烫头","泡妹"]}
list5={}

for l1 in list1:
    # 判断list5中的key是否有l1中的key
    if l1["name"] in list5:
        list5[l1["name"]]["hobby_list"].append(l1["hobby"])
    else:
        list5[l1["name"]]={"name":l1["name"],"hobby_list":[l1["hobby"]]}

print(list(list5.values()))

